RealTime messaging Unity with Nakama
リアルタイムチャットを作ってみる。
Client Connect
code: NakamaClient.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Nakama;
public class NakamaClient : MonoBehaviour
{
private readonly IClient client = new Client("http", "127.0.0.1", 7350, "defaultkey");
async void Start()
{
const string email = "greatsword8821@gmail.com";
const string password = "maxy8821";
var session = await client.AuthenticateEmailAsync(email, password);
Debug.Log(session);
}
}
これは簡単。
IClient は、Nakama namespaceにあるinterface名
必要なもの
Nakama server との socket connection
clientは、Nakamaから情報をrecieveする
TCPな部分
socketは、Nakamaへsend backするために必要
socketはリアルタイムな部分
メッセージはDBに入れて永続化する。
Socket 作成 & 接続
最初にAuthenticateで取得したsessionオブジェクトを必要とする。
code: connect.cs
public class NakamaClient : MonoBehaviour
{
private readonly IClient client = new Client("http", "127.0.0.1", 7350, "defaultkey");
private ISocket socket;
async void Start()
{
// ソケットを作成
socket = client.NewSocket();
// イベントハンドラーを追加
socket.Connected += () => Debug.Log("socket connected!");
socket.Closed += () => Debug.Log("socket closed!");
// 接続
await socket.ConnectAsync(session);
}
private void OnApplicationQuit()
{
socket?.CloseAsync();
}
}
ISocketはinterface
? は Non Nullのときだけメソッド実行。
チャットルームの種類
1 on 1
Group
Room
ユーザーが作ったグループで会話ができる。
1 on 1 は 2人だけのグループという特殊パターンでしかない。
ルール
チャットルームは特別に作ったりする必要はない。
3つのものによって定義される。
name
ユニークなもの
player
参加している人たち
type
Room, Group, Directmessage
チャットに接続
ISocket.JoinChatAsync( )
code: cs
ISocket.JoinChatAsync(string target, ChannelType type, bool persistence = false, bool hidden = false)
接続されたsocketを使って、チャットに参加する。
第一引数の target には、第二引数のtypeによって指定すべき文字列が変わる
ChannelType.DirectMessage = playerId
ユニークなNakama ID
ChannelType.Room = roomName
ChannelType.Group = groupId
code: join.cs
var channel = await socket.JoinChatAsync(RoomName, ChannelType.Room);
Debug.LogFormat("Join chat channel: {0}", channel);
Send
メッセージはjsonでなければならない(?)
普通のstringを渡しても送信されない
string化したjsonだけ
Nakama のライブラリにjsonツールが含まれてる。
code: WriteMessageToChat.cs
var content = new Dictionary<string, string> { { "hello", "world" } }.ToJson();
// 取得したchannelに、conentを書き込む。
_ = socket.WriteChatMessageAsync(channel, content);
送信を実行すると、ソケットの状態が戻り値として帰ってくるが、いらないので_で捨てる。
Recieve
socketにlamda式を登録しておくことで、Messageを受け取ったときの処理を定義できる。
channelに接続するより前にやっとく
code: recieve.cs
socket.ReceivedChannelMessage += message =>
{
Debug.LogFormat("Recieved: {0}", message.Content);
};
+=でコールバックを渡すのが違和感。
複数渡せるのだろうか
その他のRealTime要素
NakamaのMessage機能は、大体のRealTimeな要素に適用できる。
カードゲーム
リアルタイムRPG
co-op
fps
jsonのKey/Valueになってるので、
EventType/valueみたいな感じにしてイベントシステム風に使うのもあり。
ただしJoinChatっていう関数名がチャット専用っぽく感じさせる。
次
Lobby機能
RealTime Multiplayer game